#include "Nodo.h"

/* Constructor de nodo
Pre:
Post: Instancia valida de nodo */
Nodo::Nodo() {
	this->siguiente = 0;
	this->dato = 0;
	this->freezado = false;
	this->anterior = 0;
}

/* Destructor del nodo
Pre:
Post: Elimina la instancia */
Nodo::~Nodo() {
	this->siguiente = 0;
	delete(this->dato);
}

/* hay_siguiente()
Pre: Nodo creado y no vacio
Post: Devuelve 1 si hay un nodo siguiente, en caso contrario 0*/
int Nodo::hay_siguiente() {
	if (this->siguiente) return HAY_SIGUIENTE;
	else return NO_HAY_SIGUIENTE;
}

/* devolver_sig()
Pre: Nodo creado y no vacio, nodo siguiente existente
Post:  devuelve el nodo siguiente */
Nodo* Nodo::get_siguiente() {
	return (this->siguiente);
}

Nodo* Nodo::get_anterior() {
	return this->anterior;
}

/* devolver_elem()
Pre: Nodo creado y no vacio
Post: Devuelve un puntero a la movida almacenada  */
Termino* Nodo:: devolver_elem() {
	return (this->dato);
}

/* agregar_sig
Pre: Nodo creado y no vacio
Post: Agrega uno nodo siguiente al nodo actual  */
void Nodo:: set_siguiente(Nodo* sig) {
	this->siguiente = sig;
}

void Nodo:: set_anterior(Nodo* ant) {
	this->anterior = ant;
}

/* agregar_elem
Pre:  nodo creado y no vacio
Post: agrega una movida al nodo actual */
void Nodo:: agregar_elem(Termino* elem) {
	this->dato = elem;
}

void Nodo::grabar(FILE* salida, int modo) {
	if (modo == 0) {
		this->dato->grabar(salida);
	}
	else {
		this->dato->grabarConFormato(salida);
	}
}

void Nodo::grabar(char* buffer, int* pos_actual) {
	Termino* ter = this->dato;
	int longitud = ter->getLong();
	int doc = ter->getDoc();
	char* termino = ter->getTermino();
	memcpy(&buffer[(*pos_actual)], &longitud, sizeof(int));
	(*pos_actual) = (*pos_actual) + 4;
	memcpy(&buffer[*pos_actual], &doc, sizeof(int));
	(*pos_actual) = (*pos_actual) + 4;
	memcpy(&buffer[*pos_actual] , &(*termino), longitud);
	(*pos_actual) = (*pos_actual) + longitud;
}

void Nodo::congelar() {
	this->freezado = true;
}

void Nodo::descongelar() {
	this->freezado = false;
}

bool Nodo::iscongelado() {
	return this->freezado;
}
